home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
games
/
spassion
/
source.lzh
/
SOURCE
/
FuncEnemy
/
BOSSARM.C
< prev
next >
Wrap
Text File
|
2000-03-21
|
8KB
|
300 lines
/*
#include <stdio.h>
#include <iocslib.h>
*/
/* ボスの腕 */
#include <xsp2lib.h>
#include "../SPASSION.H"
#include "../player.h"
#include "../enemy.h"
#include "../eshot.h"
#include "../effect.h"
#include "../priority.h"
#include "../sound.h"
#include "../entry.h"
#include "../SUB.H"
#ifndef NULL
#define NULL ((void *) 0)
#endif
#define P_X (*((short *) (&player[0].lx))) /*lxの上位ワード*/
#define P_Y (*((short *) (&player[0].ly))) /*lyの上位ワード*/
#define PALET_MAIN 0x0700
static short MoveEnemyBossArm(ENEMY *);
static short MoveEnemyBossArm1(ENEMY *);
/*static void TiniEnemyBossArm(ENEMY *);*/
static HIT_XY4 hit_head_p[]={0-8-PLAYER_HIT_X,0-8-PLAYER_HIT_Y,0+8+PLAYER_HIT_X,0+8+PLAYER_HIT_Y};
static HIT_XY4 hit_head_o[]={0-8-OPTION_HIT_X,0-8-OPTION_HIT_Y,0+8+OPTION_HIT_X,0+8+OPTION_HIT_Y};
static HIT_XY4 hit_head_s[]={0-8,0-8,0+8,0+8};
static HIT_XY4 hit_body_p[]={
0-10-PLAYER_HIT_X,0-10-PLAYER_HIT_Y,0+10+PLAYER_HIT_X,0+10+PLAYER_HIT_Y
};
static HIT_XY4 hit_body_s[]={
0-10,0-10,0+10,0+10
};
extern HIT_XY4 nohit;
void InitEnemyBossArmHit( void )
{
}
void InitEnemyBossArm1Hit( void )
{
}
void InitEnemyBossArm(ENEMY *ene)
{
short pri[2]={PRIORITY_BOSS_PARTS_L,PRIORITY_BOSS_PARTS};
ene->info = PALET_MAIN | pri[ene->arg>>12];
ene->vx = 0;
if( !(ene->arg&0x0F00) ){
ene->vy = -65536/2;
ene->angle = 0;
}else{
ene->vy = 65536/2;
ene->angle = 128;
}
ene->hit_p[0] = &hit_body_p[0];ene->hit_p[1]=NULL;
ene->hit_o[0] = &nohit ;ene->hit_o[1]=NULL;
ene->hit_s[0] = &hit_body_s[0];ene->hit_s[1]=NULL;
ene->pt = obj_dragon+160;
ene->work = 0;
ene->no_dead = 0;
ene->func_enemy_move = MoveEnemyBossArm;
/* ene->func_enemy_tini = TiniEnemyBossArm;*/
ene->arg--;
if( (char)ene->arg < 0 )
ene->arg++;
if( (char)ene->arg )
ene->child=MakeEnemy(ENEMY_BOSSARM , ene->lx>>16, ene->ly>>16,ene->arg, ene);
else
ene->child=MakeEnemy(ENEMY_BOSSARM1, ene->lx>>16, ene->ly>>16,ene->arg, ene);
}
/* 腕の先端 */
void InitEnemyBossArm1(ENEMY *ene)
{
ene->pt = obj_dragon;
ene->vx = 0;
if( !(ene->arg&0x0F00) ){
ene->vy = -65536/2;
ene->angle = 192;
}else{
ene->vy = 65536/2;
ene->angle = 192;
}
ene->hit_p[0] = &nohit;
ene->hit_o[0] = &nohit;
ene->hit_s[0] = &nohit;
ene->hp = 200;
ene->work = 0;
ene->func_enemy_move = MoveEnemyBossArm1;
/* ene->func_enemy_tini = TiniEnemyBossArm;*/
}
static void GetAngle( ENEMY *ene )
{
unsigned char tmp,p_num=0;
if( play_mode == MODE_2P && (ene->arg&0x0F00) )
p_num=1;
if( ++ene->work2 > 4 ){ /* 4 回ごとに向き修正 */
tmp = calc_direction( ENE_X, ENE_Y, player[p_num].x,player[p_num].y );
tmp = (tmp - ene->angle) & (256 - 1);
if( tmp ){
if (tmp > 127) ene->angle-=2;
else ene->angle+=2;
ene->angle &= 256 - 1;
}
ene->work2=0;
}
}
/* 腕 */
static short MoveEnemyBossArm( ENEMY *ene )
{
int t;
if( ene->child_death ){
if( ene->child_kill ){
ene->child->child_kill=1;
return (0); /* 消去 */
}else
return 1;
}
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
ene->x = (ene->lx += ene->vx) >> 16;
ene->y = (ene->ly += ene->vy) >> 16;
switch (ene->state){
case 0: /* 縦方向に伸びる */
t=ene->parent->ly-ene->ly;
if(t<0)t*=-1;
if( t > vy_tbl[30][128] ){
ene->vy=0;
ene->state++;
}
ene->lx=ene->parent->lx;
break;
case 1: /* 縦方向に伸びる */
if( ene->child->state==2 ) /* 子オブジェクトが伸びきるまで待つ */
ene->state++;
ene->lx=ene->parent->lx;
break;
case 2:
GetAngle(ene);
ene->lx=ene->parent->lx+vx_tbl[30][ene->angle];
ene->ly=ene->parent->ly+vy_tbl[30][ene->angle];
break;
case 3:
break;
}
if( ene->child->child_death ){
if( ene->work++>20 ){
MakeEffect(EFFECT_HAHENMINI, 0, ene->x, ene->y);
ene->child_death=1;
ene->hit_p[0]=NULL;
}
}
xobj_set_st(ene);
return(1);
}
/* 腕の先端 */
static short MoveEnemyBossArm1( ENEMY *ene )
{
int t;
short speed;
short pri[2]={PRIORITY_BOSS_PARTS_L,PRIORITY_BOSS_PARTS};
short Wait( ENEMY *ene, short time );
if( ene->child_death ){
if( ene->child_kill ){
return (0); /* 消去 */
}else
return 1;
}
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
ene->x = (ene->lx += ene->vx) >> 16;
ene->y = (ene->ly += ene->vy) >> 16;
GetAngle(ene);
ene->pt = obj_dragon + (ene->angle >> 3);
if( ene->arg&0x0F00 )
ene->pt += 64;
switch (ene->state){
case 0: /* 縦方向に伸びる */
t=ene->parent->ly-ene->ly;
if(t<0)t*=-1;
if( t > vy_tbl[30][128] ){
ene->vy=0;
ene->hit_p[0] = &hit_head_p[0];
ene->hit_o[0] = &hit_head_o[0];
ene->hit_s[0] = &hit_head_s[0];
ene->state+=2;
}
ene->lx=ene->parent->lx;
break;
case 2: /* しばらく自機を追いかける */
ene->lx=ene->parent->lx+vx_tbl[30][ene->parent->angle];
ene->ly=ene->parent->ly+vy_tbl[30][ene->parent->angle];
if( Wait( ene, 240) )ene->state++;
break;
case 3: /* 吸い込む */
if( !Wait( ene, 240) ){
ene->pt += 32;
ene->lx=ene->parent->lx+vx_tbl[30][ene->parent->angle];
ene->ly=ene->parent->ly+vy_tbl[30][ene->parent->angle];
if( ene->count < 48 ){
gr1_vx-=(32768*2/48);
gr2_vx-=(21845*2/48);
speed=(ene->work++)/16;
}else if( ene->count < 256-48 ){
speed=ene->work/16;
}else{
gr1_vx+=(32768*2/48);
gr2_vx+=(21845*2/48);
speed=(ene->work--)/16;
if(speed<0)speed=0;
}
player[0].lx-=vx_tbl[speed][calc_direction( ENE_X, ENE_Y, P_X, P_Y )];
player[0].ly-=vy_tbl[speed][calc_direction( ENE_X, ENE_Y, P_X, P_Y )];
if( (*((short *)(&player[0].lx))) < PLAYER_MIN_X )
player[0].lx = PLAYER_MIN_X<<16;
if( (*((short *)(&player[0].lx))) > PLAYER_MAX_X )
player[0].lx = PLAYER_MAX_X<<16;
if( (*((short *)(&player[0].ly))) < PLAYER_MIN_Y )
player[0].ly = PLAYER_MIN_Y<<16;
if( (*((short *)(&player[0].ly))) > PLAYER_MAX_Y )
player[0].ly = PLAYER_MAX_Y<<16;
player[0].x = (*((short *)(&player[0].lx))); /*lxの上位ワード*/
player[0].y = (*((short *)(&player[0].ly))); /*lyの上位ワード*/
if( play_mode == MODE_2P ){
player[1].lx-=vx_tbl[6][calc_direction( ENE_X, ENE_Y, P_X, P_Y )];
player[1].ly-=vy_tbl[6][calc_direction( ENE_X, ENE_Y, P_X, P_Y )];
if( (*((short *)(&player[1].lx))) < PLAYER_MIN_X )
player[1].lx = PLAYER_MIN_X<<16;
if( (*((short *)(&player[1].lx))) > PLAYER_MAX_X )
player[1].lx = PLAYER_MAX_X<<16;
if( (*((short *)(&player[1].ly))) < PLAYER_MIN_Y )
player[1].ly = PLAYER_MIN_Y<<16;
if( (*((short *)(&player[1].ly))) > PLAYER_MAX_Y )
player[1].ly = PLAYER_MAX_Y<<16;
player[1].x = (*((short *)(&player[1].lx))); /*lxの上位ワード*/
player[1].y = (*((short *)(&player[1].ly))); /*lyの上位ワード*/
}
SetSE(SE_VACUUM); /* 吸い込み音 */
}else{
ene->state=2;
ene->work=0;
gr1_vx=32768;
gr2_vx=21845;
}
}
/* ダメージを受けた時の処理 */
if(ene->damage){
SetSE(SE_DAMAGE); /* 効果音 */
ene->info = PALET_DAMAGE | pri[ene->arg>>12];
/* スクロール値が戻っているときに破壊 */
if( (ene->hp -= ene->damage) <= 0 && ene->state==2 ){
MakeEffect(EFFECT_EXPL, 0, ene->x, ene->y);
SetSE(SE_EXPL_MBOSS); /* 爆発音 */
if(disp_level == DISP_LEVEL_HIGH)
MakeEffect (EFFECT_HAHENMINI, 0, ene->x, ene->y);
if(!eshot_erase)
eshot_erase = ESHOT_ERASE; /* 弾消し */
ene->player->score += 10;
ene->hit_p[0]=NULL;
ene->child_death = 1;
}
ene->damage = 0;
}else
ene->info = PALET_MAIN | pri[ene->arg>>12];
xobj_set_st(ene);
return 1;
}
/*
static void TiniEnemyBossArm(ENEMY * p)
{
}
*/